0%

MRCTF2020Transform-[WUSTCTF2020]level1-[WUSTCTF2020]level2-[GWCTF 2019]xxor

[MRCTF2020]Transform

在这里插入图片描述
ida64打开,找到main函数
在这里插入图片描述
dword_40F040:在这里插入图片描述
注意:
在这里插入图片描述
所以上面dword_40f040最后那个 8 dup(0) 的数据不是8,而是0

byte_40F0E0:
在这里插入图片描述
倒回去就行了,写脚本:

1
2
3
4
5
6
7
8
9
10
11
12
dword_40F040 = [0x9, 0x0A, 0x0F, 0x17, 0x7, 0x18, 0x0C, 0x6, 0x1, 0x10, 0x3, 0x11, 0x20, 0x1D, 0x0B, 0x1E, 0x1B, 0x16, 0x4, 0x0D, 0x13, 0x14, 0x15, 0x2, 0x19, 0x5, 0x1F, 0x8, 0x12, 0x1A, 0x1C, 0x0E, 0]
byte_40F0E0 = [0x67, 0x79, 0x7B, 0x7F, 0x75, 0x2B, 0x3C, 0x52, 0x53, 0x79, 0x57, 0x5E, 0x5D, 0x42, 0x7B, 0x2D, 0x2A, 0x66, 0x42, 0x7E, 0x4C, 0x57, 0x79, 0x41, 0x6B, 0x7E, 0x65, 0x3C, 0x5C, 0x45, 0x6F, 0x62, 0x4D]

flag = [0]*33

for i in range(len(dword_40F040)):
byte_40F0E0[i] ^= dword_40F040[i]

for i in range(len(dword_40F040)):
flag[dword_40F040[i]] = byte_40F0E0[i]

print (''.join([chr(x) for x in flag]))

MRCTF{Tr4nsp0sltiON_Clph3r_1s_3z}

flag是:flag{Tr4nsp0sltiON_Clph3r_1s_3z}

[WUSTCTF2020]level1

两个文件,有一个是OUTPUT,打开发现是一串数字,猜测是程序输出的东西
在这里插入图片描述
看另外一个文件

在这里插入图片描述
ida64打开,看main函数
在这里插入图片描述
打开flag文件读取内容,之后将里面的内容按照12行到18行的语句进行处理后输出,输出的按照之前的猜测就是OUTPUT文件里面的内容。

1
2
3
4
5
6
7
a = ['0',198,232,816,200,1536,300,6144,984,51200,570,92160,1200,565248,756,1474560,800,6291456,1782,65536000]

for i in range(1, 20):
if (i & 1):
print(chr(a[i] >> (i)),end="")
else:
print (chr(a[i] // (i)),end="")

ctf2020{d9-dE6-20c}

flag是:flag{d9-dE6-20c}

[WUSTCTF2020]level2

在这里插入图片描述
UPX壳,kali脱壳
在这里插入图片描述


ida64打开
不知道为什么64说要用32,32说要用64,只好先查看字符串
在这里插入图片描述
结果在最下面发现了这个,就是flag

flag是:flag{Just_upx_-d}

[GWCTF 2019]xxor

在这里插入图片描述
ida64
在这里插入图片描述
首先输入一个字符串,然后进行中间部分的操作,最后需要满足44行的if判断,看一下函数sub_400770
在这里插入图片描述
得到这样的关系式,求解

1
2
3
4
5
6
a1[2] - a1[3] = 2225223423
a1[3] + a1[4] = 4201428739
a1[2] - a1[4] = 1121399208
a1[0] = 3746099070
a1[5] = 550153460
a1[1] = 550153460

利用z3
安装z3的命令:

1
python -m pip install z3-solver
1
2
3
4
5
6
7
8
9
10
11
from z3 import *

a2,a3,a4 = BitVecs('a2 a3 a4',64)
s = Solver()
s.add(a2 - a3 == 2225223423)
s.add(a3 + a4 == 4201428739)
s.add(a2 - a4 == 1121399208)
if s.check() == sat:
m = s.model()
for i in m:
print("%s = %ld" % (i, m[i].as_long()))

在这里插入图片描述
现在a1数组里的值就都知道了

1
a1=[3746099070, 550153460, 3774025685, 1548802262, 2652626477, 2230518816]

程序在main函数的36~43行进行了操作,看一下函数sub_400686
在这里插入图片描述
这是一个利用已知数组unk_601060对我们输入的整型数组进行异或操作,因此只需要将整个过程逆过来,for循环那段,将异或过程看成一个整体,最后就能得到输入的整型数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
int main()
{
unsigned int xorm[6];
xorm[0] = 3746099070;
xorm[1] = 550153460;
xorm[2] = 3774025685;
xorm[3] = 1548802262;
xorm[4] = 2652626477;
xorm[5] = 2230518816;
int i = 0,j=0,sum;
unsigned int temp[2] = {0};
unsigned int data[4] = { 2,2,3,4 };
for (i = 0; i < 5; i += 2)
{
temp[0] = xorm[i];
temp[1] = xorm[i + 1];

sum = 0x458BCD42 * 64;
for (j = 0; j < 64; j++)
{
temp[1] -= (temp[0] + sum + 20) ^ ((temp[0] << 6) + 3) ^ ((temp[0] >> 9) + 4) ^ 0x10;
temp[0] -= (temp[1] + sum + 11) ^ ((temp[1] << 6) + 2) ^ ((temp[1] >> 9) + 2) ^ 0x20;
sum -= 0x458BCD42;
}
xorm[i] = temp[0];
xorm[i + 1] = temp[1];
}
for (i = 0; i < 6; i++)
printf("%x",xorm[i]);

}

在这里插入图片描述
在这里插入图片描述
所以要将16进制转换成字符串
利用在线工具
在这里插入图片描述
flag是:flag{re_is_great!}